// 目的：  实现数据的增删改查
// 1.搭建服务器
let express = require('express');
let app = express();


let server = require('http').Server(app);
// 2.创建socket服务
let io = require('socket.io')(server);


// 2.处理静态资源路径
app.use('/public', express.static('public'))
app.use('/uploads', express.static('uploads'))
// 3.设置模板引擎及视图目录
app.set('views', './views');
app.set('view engine', "ejs")
// 端口号
server.listen(3000, () => {
    console.log(3000 + "端口正在运行");
})
// 4.设置数据库配置项
let mysql = require('mysql');
let db = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "root",
    database: "web72",
    port: "3306"
})
db.connect();

// 5.引入body-parser，用来处理post数据请求
let bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())


// cookie使用操作
// 7.安装cookie
// npm install cookie-parser
// 7.1.引入
let  cookieParser = require("cookie-parser")

// 7.2.设置中间件   [中间件***]
app.use(cookieParser())

//6. 设置路由，处理项目逻辑
// 6.1访问http://localhost:3000   直接访问根路径，要加载index.ejs
app.get('/', (req, res) => {
    // 重定向就是跳转的意思
    res.redirect("/index"); // 重定向 redirect(路由)
})
// 6.1访问http://localhost:3000/index   直接访问根路径，要加载index.ejs
app.get("/index", (req, res) => {

    //发起sql请求，将数据渲染到index.ejs
    db.query('select *  from  yingxiong', (error, results) => {
        if (!error) {
            // 取出用户的cookie信息
            let user = req.cookies.user || null;
            // console.log(user);
            // 渲染index.ejs
            res.render("index", { roles: results, user })
        }
    })

})

// 9.27

// 6.7设置一个路由，加载登录页面
app.get('/login', (req, res) => {
    res.render("login");
})

// 6.8执行登录
app.post("/doLogin", (req, res) => {
    // 获取用户名和密码
    let { user, pass } = req.body; // req.query  get

    // console.log({user,pass});//  admin 123
    /*
        思路：
            1.直接传入user及pass一起去数据库做查询，如果存在，那就登录成功，返回首页index
            2.如果登录失败，返回登录页面，重新登录

    */
    let sql = "select *  from  user  where  user=? and  pass = ?";
    db.query(sql, [user, pass], (err, results) => {
        // console.log(err);
        // console.log(results);
        if (results.length > 0) {
            // 用户存在，登录成功
            // 用户的存储cookie
            res.cookie('user',user,{})
            res.redirect('/index');
        } else {
            // 用户不存在，账号或密码错误
            res.send(`<script>alert('账号或密码错误!');location.href='/login';</script>`)
        }
    })

})
// 使用ajax实现登录
app.post("/doLoginByAjax", (req, res) => {
    // 获取用户名和密码
    let { user, pass } = req.body; // req.query  get
    let sql = "select *  from  user  where  user=? and  pass = ?";
    db.query(sql, [user, pass], (err, results) => {
        if (results.length > 0) {
            // 进行登录会话的存储
            res.cookie('user',user,{})
            res.send({
                code: 200,
                msg: "登录成功"
            })
        } else {
            res.send({
                code: 600,
                msg: "账号或者密码错误！"
            })
        }
    })

})

// 6.9 .注销功能
app.get("/out",(req,res)=>{
    res.clearCookie('user');
    res.redirect("/index")
})


// session 操作
// 1.安装session 
// npm  install  express-session
// 2.引入
let  session   = require("express-session");
// 3.使用中间件
app.use(session({
    secret:"abcd",//自定义的加密方式
    resave:true, //重复设置session，会更新session存储时间
    saveUninitialized:true, //在客户端生成唯一标识
    cookie:{ // cookie的配置项

    }
}))

// 4.在路由中使用session
// 设置  获取  删除 
// req.session
// 设置
app.get("/setSession",(req,res)=>{

    req.session.num = 99;
    req.session.age = 20;
    res.send();
})

// 获取
app.get("/getSession",(req,res)=>{
    var num = req.session.num;
    var age = req.session.age;
    console.log(num,age);
    res.send()
})

// 删除
app.get("/removeSession",(req,res)=>{
    // 1.第一种方式
    // req.session.num = null;
    // console.log(req.session); //  session = { num,age, }
    // 2.使用内置的方法
    req.session.destroy(function(){
        console.log("删除成功");
        res.send()
    })
    
})

// 加载聊天室页面
app.get('/lts',(req,res)=>{

    res.render('lts')
})

io.on("connection",(socket)=>{
    console.log("服务链接了");
    // 接收订阅消息
    socket.on('h5-72',(msg)=>{
        // console.log(msg);
      // broadcast  自己不接收服务端的数据，其他的链接接收
        socket.broadcast.emit("h5-72",msg)
    })
})

